home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 3
/
Gold Medal Software - Volume 3 (Gold Medal) (1994).iso
/
prog
/
word.arj
/
OLIST.C
< prev
next >
Wrap
Text File
|
1992-01-02
|
3KB
|
83 lines
/* Object list-related functions. */
#include <stdio.h>
#include "polygon.h"
/* Set up the empty object list, with sentinels at both ends to
terminate searches */
void InitializeObjectList()
{
ObjectListStart.NextObject = &ObjectListEnd;
ObjectListStart.PreviousObject = NULL;
ObjectListStart.CenterInView.Z = INT_TO_FIXED(-32768);
ObjectListEnd.NextObject = NULL;
ObjectListEnd.PreviousObject = &ObjectListStart;
ObjectListEnd.CenterInView.Z = 0x7FFFFFFFL;
NumObjects = 0;
}
/* Adds an object to the object list, sorted by center Z coord. */
void AddObject(Object *ObjectPtr)
{
Object *ObjectListPtr = ObjectListStart.NextObject;
/* Find the insertion point. Guaranteed to terminate because of
the end sentinel */
while (ObjectPtr->CenterInView.Z > ObjectListPtr->CenterInView.Z) {
ObjectListPtr = ObjectListPtr->NextObject;
}
/* Link in the new object */
ObjectListPtr->PreviousObject->NextObject = ObjectPtr;
ObjectPtr->NextObject = ObjectListPtr;
ObjectPtr->PreviousObject = ObjectListPtr->PreviousObject;
ObjectListPtr->PreviousObject = ObjectPtr;
NumObjects++;
}
/* Resorts the objects in order of ascending center Z coordinate in
view space, by moving each object in turn to the correct position
in the object list. */
void SortObjects()
{
int i;
Object *ObjectPtr, *ObjectCmpPtr, *NextObjectPtr;
/* Start checking with the second object */
ObjectCmpPtr = ObjectListStart.NextObject;
ObjectPtr = ObjectCmpPtr->NextObject;
for (i=1; i<NumObjects; i++) {
/* See if we need to move backward through the list */
if (ObjectPtr->CenterInView.Z < ObjectCmpPtr->CenterInView.Z) {
/* Remember where to resume sorting with the next object */
NextObjectPtr = ObjectPtr->NextObject;
/* Yes, move backward until we find the proper insertion
point. Termination guaranteed because of start sentinel */
do {
ObjectCmpPtr = ObjectCmpPtr->PreviousObject;
} while (ObjectPtr->CenterInView.Z <
ObjectCmpPtr->CenterInView.Z);
/* Now move the object to its new location */
/* Unlink the object at the old location */
ObjectPtr->PreviousObject->NextObject =
ObjectPtr->NextObject;
ObjectPtr->NextObject->PreviousObject =
ObjectPtr->PreviousObject;
/* Link in the object at the new location */
ObjectCmpPtr->NextObject->PreviousObject = ObjectPtr;
ObjectPtr->PreviousObject = ObjectCmpPtr;
ObjectPtr->NextObject = ObjectCmpPtr->NextObject;
ObjectCmpPtr->NextObject = ObjectPtr;
/* Advance to the next object to sort */
ObjectCmpPtr = NextObjectPtr->PreviousObject;
ObjectPtr = NextObjectPtr;
} else {
/* Advance to the next object to sort */
ObjectCmpPtr = ObjectPtr;
ObjectPtr = ObjectPtr->NextObject;
}
}
}